Austretende doppelte Anführungszeichen in Batch-Skript
-
05-09-2019 - |
Frage
Wie würde ich mich über all die doppelten Anführungszeichen in meiner Batch-Datei der Parametern mit entkam doppelten Anführungszeichen zu ersetzen? Dies ist meine aktuelle Batch-Datei, die alle seine Kommandozeilen-Parameter innerhalb der Zeichenfolge erweitert:
@echo off
call bash --verbose -c "g++-linux-4.1 %*"
Es nutzt dann diese Zeichenfolge einen Aufruf an Cygwin bash zu machen, einen Linux-Cross-Compiler ausführt. Leider bin ich Parameter wie diese immer an meine Batch-Datei übergeben:
"launch-linux-g++.bat" -ftemplate-depth-128 -O3 -finline-functions
-Wno-inline -Wall -DNDEBUG -c
-o "C:\Users\Me\Documents\Testing\SparseLib\bin\Win32\LinuxRelease\hello.o"
"c:\Users\Me\Documents\Testing\SparseLib\SparseLib\hello.cpp"
Wenn das erste Zitat um den ersten übergeben Weg in vorzeitig endet die Zeichenfolge GCC geleitet wird, und Leiten der Rest der Parameter direkt zu bash (die spektakulär ausfällt.)
Ich stelle mir vor, wenn ich die Parameter in einem einzigen String verketten kann dann die Anführungszeichen entkommen es sollte funktionieren, aber ich habe Schwierigkeiten, zu bestimmen, wie dies zu tun. Kennt jemand?
Lösung 3
Google kam schließlich mit der Antwort auf. Die Syntax für die Zeichenfolge Ersatz im Batch ist dies:
set v_myvar=replace me
set v_myvar=%v_myvar:ace=icate%
Welche produziert "replizieren me". Mein Skript sieht nun wie folgt aus:
@echo off
set v_params=%*
set v_params=%v_params:"=\"%
call bash -c "g++-linux-4.1 %v_params%"
Welche alle Instanzen "
mit \"
ersetzt, entkam richtig für bash.
Andere Tipps
Die Escape-Zeichen in Batch-Skripten sind ^
. Aber für Strings in doppelten Anführungszeichen, verdoppelt die Anführungszeichen:
"string with an embedded "" character"
eplawless eigene Antwort einfach und effektiv löst sein spezifisches Problem: es alle mit "
\"
Instanzen im gesamten Argumentliste ersetzt , das ist, wie Bash doppelte Anführungszeichen innerhalb eines Strings in doppelten Anführungszeichen erfordert dargestellt werden.
im Allgemeinen auf die Frage von zu beantworten, wie doppelte Anführungszeichen innerhalb eines Strings in doppelten Anführungszeichen mit cmd.exe
zu entkommen , die Windows-Befehlszeilen-Interpreter (ob auf der Kommandozeile - oft noch fälschlicherweise als " DOS-Eingabeaufforderung“- oder in einer Batch-Datei): Boden für einen Blick finden Sie in Powershell
tl; dr :
-
Sie muss Verwendung
""
beim Passieren einer Zeichenfolge , um eine (weitere) Batch-Datei und Sie können Verwendung""
mit Anwendungen erstellt Microsoft 's C / C ++ /. NET-Compiler (die auch akzeptieren\"
), die unter Windows enthält Python und Node.js :-
Beispiel:
foo.bat "We had 3"" of rain."
-
Das gilt für Batch-Dateien nur:
-
""
ist der einzige Weg, um die Kommando-Interpreter (cmd.exe
) zu behandeln, um die ganzen Strings in doppelten Anführungszeichen als Single Argument. bekommen
-
Leider ist jedoch nicht nur die umschließende beibehalten doppelten Anführungszeichen (wie üblich), aber so die verdoppelten entkam diejenigen sind, so die beabsichtigte Zeichenfolge zu erhalten, ist ein zweistufiger Prozess; beispielsweise unter der Annahme, dass der doppelten Anführungszeichen Zeichenfolge als erstes Argument übergeben wird,
%1
: -
set "str=%~1"
entfernt die umschließenden Anführungszeichen;set "str=%str:""="%"
wandelt dann die verdoppelten doppelten Anführungszeichen zu einzelnen Einsen.
Achten Sie darauf, die umschließenden Anführungszeichen um die Zuordnung Teile zu verwenden, um unerwünschte Interpretation der Werte zu verhindern.
-
-
-
\"
ist erforderlich - als einzige Option - von vielen anderen Programmen , (! ZB, Ruby, Perl und sogar Microsofts eigenes Powershell ()) , aber ITS USE ist nicht sicher :-
\"
ist, was viele ausführbaren Dateien und Dolmetscher entweder erfordern - einschließlich Microsofts eigenes Powershell, wenn Strings übergeben von außen - oder, im Fall von Microsoft-Compiler, Unterstützung als Alternative zu""
-. letztlich aber es ist Programm zum Ziel, um die Argumentliste zu analysieren- Beispiel:
foo.exe "We had 3\" of rain."
- Beispiel:
- JEDOCH VERWENDUNG VON
\"
KANN IN UNWANTED, ARBITRARY Ausführung von Befehlen Ergebnis und / oder Ein- / Ausgabeumleitungen :- Die folgenden Zeichen präsentieren dieses Risiko:
& | < >
- Zum Beispiel kann die folgenden Ergebnisse in unbeabsichtigter Ausführung des Befehls
ver
; siehe weiter unten für eine Erklärung und der nächsten Aufzählungspunkt für dieses Problem zu umgehen:-
foo.exe "3\" of snow" "& ver."
-
- Die folgenden Zeichen präsentieren dieses Risiko:
- für Powershell auf Fenster ,
\""
und"^""
robust ist, aber begrenzte Alternativen (Abschnitt "Aufruf Powershell CLI ..." siehe unten ).
-
-
Wenn Sie
\"
verwenden müssen, gibt es nur 3 sicher Ansätze , die jedoch recht umständlich : Spitze des Hutes zu TS für seine Hilfe.-
Verwendung von (möglicherweise selektiven ) verzögert variable Erweiterung in Batch-Datei, können Sie speichern wörtliche
\"
in einem Variable und Referenz, die Variable innerhalb eines"..."
String!var!
Syntax Arbeiten - siehe T Ss hilfreiche Antwort .- Der obige Ansatz trotz umständlich ist, hat den Vorteil, dass Sie es anwenden können methodisch und dass es funktioniert robust , mit jedem Eingang.
-
Nur mit Literalzeichenfolgen - diejenigen, mit denen keine VARIABLES - bekommt man einen ähnlich methodischen Ansatz: kategorisch
^
-escape allecmd.exe
Metazeichen:" & | < >
und - falls Sie wollen auch variable Expansion zu unterdrücken -%
:
foo.exe ^"3\^" of snow^" ^"^& ver.^"
-
Ansonsten müssen Sie formulieren Sie Ihre Zeichenfolge basierend auf dem Erkennen, welche Teile des Strings
cmd.exe
betrachtet nicht notierte aufgrund falsch interpretiert\"
als Schlussbegrenzungszeichen:-
in wörtlichen Teile enthalten Shell-Metazeichen:
^
-entkommen sie; Im oben genannten Beispiel ist es&
die^
-escaped werden müssen:
foo.exe "3\" of snow" "^& ver."
-
in Portionen mit
%...%
Stil Variablenreferenzen : dasscmd.exe
gewährleisten hält sie Teil einer"..."
Zeichenfolge und , dass die Variablenwerte nicht selbst eingebettet haben , unausgewogene Zitate -. , die nicht einmal immer möglich ist
-
-
Hintergrundinformationen lesen Sie weiter.
Hintergrund
Hinweis: Dies ist auf Grund meiner eigenen Experimente. Lassen Sie uns wissen, wenn ich falsch bin.
POSIX-ähnliche Shells wie Bash auf Unix-ähnlichen Systemen tokenize der Argumentliste (string), bevor er Argumente einzeln in das Zielprogramm: unter anderem Erweiterungen, sie spaltete die Argumentliste in einzelne Wörter (Wort Splitting) und entfernen Sie zitieren Zeichen aus den resultierenden Worte (Zitat Entfernung). Das Zielprogramm ist ein array von einzelne Argumente , mit syntaktischen Zitate entfernt geben .
Im Gegensatz dazu Interpreter der Windows-Befehl offenbar nicht die Argumentliste nicht tokenize und einfach geht das Single string umfassend alle Argumente - einschließlich zitierte Zeichen. -. In das Zielprogramm
Allerdings einige Vorverarbeitung erfolgt, bevor die einzelne Zeichenfolge in das Zielprogramm übergeben wird: ^
Zeichen entkommen. außerhalb von Strings in doppelten Anführungszeichen werden entfernt (sie entziehen das folgende char.) und Variablenreferenzen (beispielsweise %USERNAME%
) sind interpolieren zuerst.
Im Gegensatz zu in Unix, es ist die Verantwortung des Zielprogramms zu analysieren, um die Argumente Zeichenfolge zu analysieren und es brechen in einzelne Argumente mit Zitaten entfernt. So verschiedene Programme hypothetisch entweichende Methoden erfordern, können unterschiedliche und gibt es keinen einzigen entkommen Mechanismus, der garantiert ist mit allen Programmen zu arbeiten - < a href = "https://stackoverflow.com/a/4094897/45375"> https://stackoverflow.com/a/4094897/45375 enthält ausgezeichneten Hintergrund auf der Anarchie, die Windows-Befehlszeilen Parsing ist.
In der Praxis ist \"
sehr häufig, aber NICHT SICHER , wie oben erwähnt:
Da cmd.exe
selbst nicht erkennt \"
als entkam doppelte Anführungszeichen, kann es später Token auf der Kommandozeile als falsch auslegen unquoted und möglicherweise interpretiert sie als Befehle und / oder Eingabe / Ausgabe-Umleitungen .
Auf den Punkt gebracht: die Problemflächen, wenn eine der folgenden Zeichen folgen eine Öffnen oder unausgewogen \"
: & | < >
; zum Beispiel:
foo.exe "3\" of snow" "& ver."
cmd.exe
sieht folgenden Tokens, die aus falsch interpretiert\"
als regelmäßige doppelte Anführungszeichen:
-
"3\"
-
of
-
snow" "
- Rest:
& ver.
Da cmd.exe
denkt, dass & ver.
sind unquoted , sie es als &
interpretiert (der Befehl Sequenzierung Operator), durch den Namen eines Befehls gefolgt auszuführen (ver.
- die .
ignoriert; ver
Berichte cmd.exe
der Versionsinformationen).
Der Gesamteffekt ist:
- Zuerst
foo.exe
wird aufgerufen mit dem ersten 3 Token nur. - Dann Befehl
ver
ausgeführt.
Auch in Fällen, in denen der versehentlichen Befehl keinen Schaden anrichtet, Ihr gesamte Befehl wird nicht wie vorgesehen, da nicht alle Argumente an sie übergeben werden.
Viele Compiler / Dolmetscher erkennen nur \"
- zB die GNU C / C ++ Compiler, Python, Perl, Ruby, sogar eigene Powershell Microsoft, wenn sie von cmd.exe
aufgerufen - und, mit Ausnahme von Powershell mit \""
, für sie gibt es keine einfache Lösung für dieses Problem.
Im Wesentlichen würde, Sie im Voraus wissen müssen, welche Teile der Kommandozeile als nicht notiert falsch interpretiert, und selektiv alle Instanzen ^
in diesen Abschnitten & | < >
-entweichen kann.
Im Gegensatz dazu Verwendung von ""
ist SAFE , ist aber leider nur von Microsoft-Compiler-basierten Anwendungen und Batch-Dateien (im Fall von Batch-Dateien unterstützt, mit die oben diskutierten Macken), die bemerkenswerte schließt Powershell -. siehe nächster Abschnitt
Beim Powershell CLI von cmd.exe
oder POSIX-ähnlichen Schalen:
Hinweis: Siehe den unteren Abschnitt, wie unter Angabe behandelt wird innen Powershell
. Powershell , wenn aufgerufen von außen - zum Beispiel von cmd.exe
, ob von der Kommandozeile oder einer Batch-Datei - erkennt nur \"
und unter Windows auch """
und die robustere \""
/ "^""
(obwohl intern Powershell `
als Escape-Zeichen in Strings in doppelten Anführungszeichen verwendet und akzeptiert auch ""
- siehe unten Abschnitt):
Ein Fenster , ruft aus cmd.exe
/ a Batch-Datei:
-
""
Pausen , weil es im Grunde nicht unterstützt:-
powershell -c " ""ab c"".length "
-> Fehler "Der String fehlt den Terminator"
-
-
\"
und"""
Arbeit im Prinzip , ist aber nicht sicher :-
powershell -c " \"ab c\".length "
funktioniert wie beabsichtigt: es gibt5
(beachten Sie die 2 Leerzeichen) - Aber es ist nicht sicher, da
cmd.exe
Metazeichen den Befehl brechen, es sei denn, entkam:
powershell -c " \"a& c\".length "
Pausen , aufgrund der&
, die als^&
entkommen werden müssten
-
-
\""
ist sicher , sondern Innen Leerzeichen normalisieren , die unerwünscht sein kann:-
powershell -c " \""a& c\"".length "
Ausgänge4
(!), Weil die zwei Räume auf 1 normiert sind.
-
-
"^""
ist die beste Wahl für Windows Powershell speziell , wobei es sowohl sicher als auch Leerzeichen erhaltend ist, aber mit Powershell Kern (unter Windows) ist es das gleiche wie\""
ist , das heißt whitespace- Normalisieren . Kredit geht an Venryx für diesen Ansatz zu entdecken.-
powershell -c " "^""a& c"^"".length "
funktioniert . nicht brechen - trotz&
- und Ausgänge5
, das heißt korrekt aufbewahrt Leerzeichen -
Powershell Kern :
<. / li>pwsh -c " "^""a& c"^"".length "
funktioniert , aber Ausgänge4
, dh normalisieren Leerzeichen , wie\""
tut
-
Ein Unix-ähnlichen Plattformen (Linux, MacOS), ruft Powershell Kern 's CLI, pwsh
von einem POSIX-artige Shell wie als bash
:
Sie muss Verwendung \"
, die jedoch ist sicher und Leerzeichen erhalt :
$ pwsh -c " \"a& c|\".length" # OK: 5
Verwandte Informationen
-
^
kann nur als Escape-Zeichen verwendet werden in unquoted Strings - innerhalb von Strings in doppelten Anführungszeichen,^
ist nicht besonders und so behandelt, als eine wörtliche <. / p>- CAVEAT : Verwendung von
^
in Parameter an diecall
Anweisung übergeben gebrochen (dies für beide Anwendungen voncall
gilt: Um eine andere Batch-Datei oder Binär-Aufruf, und ruft ein Unterprogramm in der gleichen Batch-Datei):-
^
Instanzen in in doppelten Anführungszeichen Werte aus unerklärlichen Gründen verdoppelt , um den Wert zu verändern weitergegeben werden: zB wenn der Variable%v%
Literalwerta^b
enthält ,call :foo "%v%"
ordnet"a^^b"
(!) (der erste Parameter) in Unterprogramm%1
:foo
. - Unquoted Verwendung von
^
mitcall
ist zusammen gebrochen in diesem^
nicht mehr verwendet werden können Sonderzeichen zu entkommen: zBcall foo.cmd a^&b
leise Pausen (statt wörtlichena&b
zufoo.cmd
zugeben, wie es der Fall ohnecall
sein) - (!).foo.cmd
nicht einmal aufgerufen wird, zumindest auf Windows 7
-
- CAVEAT : Verwendung von
-
ein wörtliche
%
Flüchten ist ein Sonderfall , leider, die je nach unterschiedlicher Syntax erfordern, ob eine Zeichenfolge auf der Befehlszeile angegeben wird vs in einer Batch-Datei . finden Sie unter https://stackoverflow.com/a/31420292/45375- Die Kurz davon: Innerhalb einer Batch-Datei, verwenden
%%
. Auf der Kommandozeile,%
nicht entziehen kann, aber wenn man einen^
am Anfang, Ende setzen, oder in einem Variablennamen in einem unquoted string (zBecho %^foo%
), können Sie variable Expansion verhindern können ( Interpolation);%
Instanzen auf der Befehlszeile, die nicht Teil einer variablen Referenz ist, werden als Literale behandelt (z.B.100%
).
- Die Kurz davon: Innerhalb einer Batch-Datei, verwenden
-
Im Allgemeinen , um sicher mit variablen Werten zu arbeiten, die Leer- und Sonderzeichen enthalten:
- Zuordnung : Enclose beide der Variablenname und der Wert in eine Single Paar doppelte Anführungszeichen ; z.B.
set "v=a & b"
Literalwerta & b
variable%v%
zuordnet (im Gegensatz dazu würde dieset v="a & b"
doppelten Anführungszeichen Teil des Wertes machen). Entfliehen wörtliche%
Instanzen als%%
. (Nur in Batch-Dateien funktioniert - siehe oben) - Referenz : Double-quote Variablenreferenzen , um sicherzustellen, dass ihr Wert nicht interpoliert wird; zum Beispiel hat
echo "%v%"
nicht den Wert von%v%
der Interpolation unterziehen und Druck"a & b"
(aber beachten Sie, dass die doppelten Anführungszeichen sind zu immer gedruckt). Im Gegensatz dazu gehtecho %v%
wörtlichena
zuecho
interpretiert&
als Befehl Sequenzierung Operator und deshalb versucht, einen Befehl namensb
auszuführen.
Beachten Sie auch die obige Einschränkung re Verwendung von^
mit dercall
Aussage. - Externe Programme nehmen in der Regel Pflege doppelte Anführungszeichen um Parameter umschließenden zu entfernen, aber, wie erwähnt, in Batch-Dateien Sie es selbst zu tun haben (zB
%~1
aus dem umschließenden doppelten Anführungszeichen zu entfernen 1. Parameter) und leider gibt es keine direkte Möglichkeit, die ich kenne zu bekommenecho
einen variablen Wert drucken getreu ohne die umschließenden Anführungszeichen .- Neil Angebote ein
for
-basierte Problemumgehung, die funktioniert, solange der Wert hat keine eingebetteten doppelte Anführungszeichen ; z.B .:
set "var=^&')|;,%!" for /f "delims=" %%v in ("%var%") do echo %%~v
- Neil Angebote ein
- Zuordnung : Enclose beide der Variablenname und der Wert in eine Single Paar doppelte Anführungszeichen ; z.B.
-
cmd.exe
tut nicht erkennen Single -quotes als String-Trennzeichen - sie werden als Literale behandelt und nicht allgemein verwendet werden kann, abgrenzen Strings mit eingebetteten Leerzeichen; auch, folgt daraus, dass die Tokens die Apostrophe und keine Token zwischen behandelt werden anstößt wie entsprechend durchcmd.exe
und interpretiert unquoted.- gegeben jedoch, dass die Zielprogramme letztlich ihr eigenes Argument Parsing durchführen, einige Programme wie Ruby tun erkennen Single-Strings in Anführungszeichen auch unter Windows; dagegen, C / C ++ ausführbare Dateien, Perl und Python tun nicht erkennen sie.
Auch wenn durch das Zielprogramm unterstützt, ist es jedoch nicht ratsam ist, Single-Strings in Anführungszeichen zu verwenden, da ihre Inhalte nicht von potentiell unerwünschten Interpretation durchcmd.exe
geschützt sind.
- gegeben jedoch, dass die Zielprogramme letztlich ihr eigenes Argument Parsing durchführen, einige Programme wie Ruby tun erkennen Single-Strings in Anführungszeichen auch unter Windows; dagegen, C / C ++ ausführbare Dateien, Perl und Python tun nicht erkennen sie.
Zitiert von in Powershell:
Windows Powershell ist eine wesentlich erweiterte Shell als cmd.exe
, und es ist ein Teil gewesen viele Jahre von Windows für jetzt (und Powershell-Core die Powershell-Erfahrung zu macOS und Linux als auch gebracht).
Powershell arbeitet konsequent intern in Bezug auf unter Angabe:
- innerhalb Strings in doppelten Anführungszeichen, verwenden
`"
oder""
doppelte Anführungszeichen zu entkommen - innerhalb Single-Strings in Anführungszeichen verwenden
''
Apostrophe zu entkommen
Dies funktioniert auf der Kommandozeile Powershell und wenn Parameter Powershell-Skripts oder Funktionen von vorbei innerhalb Powershell.
(Wie oben erläutert, einen entflohenen doppelten Anführungszeichen zu Powershell vorbei von außen erfordert \"
oder, robuster, \""
- nichts anderes Werk).
Leider beim Aufruf von externe Programme von Powershell, sind Sie mit der Notwendigkeit konfrontiert, sowohl Powershell eigene zitiert Regeln aufnehmen und für die target Programm:
Dieses problematische Verhalten wird auch in dieser GitHub docs Ausgabe
Double -quotes innerhalb von Doppel -quoted Strings :
Betrachten Zeichenfolge "3`" of rain"
, die Powershell-intern zu wörtlichem 3" of rain
übersetzt.
Wenn Sie diese Zeichenfolge an ein externes Programm übergeben wollen, Sie haben das Zielprogramm der Flucht zusätzlich zu Powershell anzuwenden; sagen Sie die Zeichenfolge in einem C-Programm übergeben werden sollen, die als \"
entkommen werden doppelte Anführungszeichen eingebettet erwartet:
foo.exe "3\`" of rain"
Beachten Sie, wie beide `"
- Pow zu machenerShell glücklich - und die \
- glücklich das Zielprogramm zu machen - müssen vorhanden sein.
Die gleiche Logik gilt eine Batch-Datei aufgerufen wird, wo ""
verwendet werden muss:
foo.bat "3`"`" of rain"
Im Gegensatz dazu Einbettung Single -quotes in Doppel -quoted Zeichenfolge erfordert überhaupt kein Entkommen.
Single -quotes innerhalb von Single -quoted Strings tun nicht erfordert Extra Flucht; betrachten '2'' of snow'
, die Darstellung ist‘Powershell von 2' of snow
.
foo.exe '2'' of snow'
foo.bat '2'' of snow'
Powershell übersetzt einfache Anführungszeichen Strings in doppelten Anführungszeichen diejenigen, bevor sie an das Zielprogramm übergeben.
Doch double -quotes innerhalb von Single -quoted Strings , die für Powershell brauchen nicht entkommen, Sie müssen noch für das Zielprogramm maskiert werden :
foo.exe '3\" of rain'
foo.bat '3"" of rain'
Powershell v3 die Magie eingeführt --%
Option , die so genannte Stop-Parsing-Symbol , die einige der Schmerzen lindert, durch alles vorbei nach es uninterpretierte in das Zielprogramm zum speichern cmd.exe
Stil umweltVariablenReferenzen (zB %USERNAME%
), die ist erweitert; z.
foo.exe --% "3\" of rain" -u %USERNAME%
Beachten Sie, wie nur für das Zielprogramm des eingebettete "
als \"
entkommen (und nicht auch für Powershell als \`"
) ausreichend.
Doch dieser Ansatz:
- darf nicht für Flucht
%
Zeichen, um umwelt variable Erweiterungen zu vermeiden. - schließt aus direkt Verwendung von Powershell-Variablen und Ausdrücke; Stattdessen muss die Befehlszeile in einem String-Variable in einem ersten Schritt aufgebaut werden, und dann mit
Invoke-Expression
in einem zweiten aufgerufen.
Somit ist trotz seiner vielen Fortschritte, hat Powershell nicht viel einfacher zu entkommen, wenn externe Programme aufrufen. Es hat sich jedoch wurde die Unterstützung für Single-Strings in Anführungszeichen.
Ich frage mich, ob es in der Windows-Welt grundsätzlich möglich ist, immer auf das Unix-Modell wechseln zu lassen, die Shell alles tun, die tokenization und Zitat Entfernung vorhersagbar vorne unabhängig von dem Zielprogramm , und dann, indem die resultierenden Token des Zielprogrammes aufrufen.
Als Ergänzung zu mklement0 der ausgezeichneten Antwort :
Fast alle ausführbaren Dateien akzeptieren \"
als entkam "
. Sichere Nutzung in cmd ist jedoch fast nur möglich mit DELAYEDEXPANSION.
Um explizit eine wörtliche "
zu einem gewissen Prozess zu senden, weisen \"
zu einer Umgebungsvariable, und dann diese Variable verwenden, wenn Sie ein Angebot übergeben müssen. Beispiel:
SETLOCAL ENABLEDELAYEDEXPANSION
set q=\"
child "malicious argument!q!&whoami"
Hinweis SETLOCAL ENABLEDELAYEDEXPANSION
scheint nur in Batch-Dateien zu arbeiten. Um DELAYEDEXPANSION in einer interaktiven Sitzung zu erhalten, startet cmd /V:ON
.
Wenn Sie Ihre Batch-Datei Arbeit mit DELAYEDEXPANSION does't, können Sie es ermöglichen, vorübergehend:
::region without DELAYEDEXPANSION
SETLOCAL ENABLEDELAYEDEXPANSION
::region with DELAYEDEXPANSION
set q=\"
echoarg.exe "ab !q! & echo danger"
ENDLOCAL
::region without DELAYEDEXPANSION
Wenn Sie von einem variablen dynamischen Inhalt zu übergeben, die Anführungszeichen enthält, die entkommen sind als ""
Sie ""
mit \"
auf Expansion ersetzen:
SETLOCAL ENABLEDELAYEDEXPANSION
foo.exe "danger & bar=region with !dynamic_content:""=\"! & danger"
ENDLOCAL
Diese Reserve ist nicht sicher mit %...%
Stil Expansion!
Bei OP bash -c "g++-linux-4.1 !v_params:"=\"!"
die sichere Version.
Wenn aus irgendeinem Grunde auch nur vorübergehend ermöglicht DELAYEDEXPANSION keine Option ist, lesen Sie auf:
Mit \"
aus cmd ist ein wenig sicherer, wenn man immer Sonderzeichen entkommen muss, statt nur manchmal. (Es ist weniger wahrscheinlich, dass eine caret zu vergessen, wenn es konsequent ist ...)
Um dies zu erreichen, ein jedes Zitat mit einem caret voran (^"
), Zitate, die das Kind Prozess als Literale erreichen sollen, müssen zusätzlich mit einem Spiel (\^"
) entwertet werden. Alle Shell-Metazeichen muss auch mit ^
entkommen, z.B. &
=> ^&
; |
=> ^|
; >
=> ^>
; etc.
Beispiel:
child ^"malicious argument\^"^&whoami^"
Quelle: Jeder zitiert Befehlszeilenargumente in die falsche Richtung finden Sie unter‚Eine bessere Methode des Zitierens‘
dynamischen Inhalt zu übergeben, muss man folgendes gewährleisten:
Der Teil des Befehls, der die Variable enthält, muss von cmd.exe
als „zitiert“ werden (dies nicht möglich ist, wenn die Variable Anführungszeichen enthalten kann - nicht schreiben %var:""=\"%
). Um dies zu erreichen, der letzte "
vor den Variablen und der erste "
nach den Variablen nicht ^
-entkam. cmd-Metazeichen zwischen diesen beiden "
darf nicht entgangen sein. Beispiel:
foo.exe ^"danger ^& bar=\"region with %dynamic_content% & danger\"^"
Dies ist nicht sicher, wenn %dynamic_content%
unerreichte Anführungszeichen enthalten.
Zum Beispiel für Unreal Engine Automation Tool von Batchdatei ausführen - das ist für mich gearbeitet
zB: -cmdline = "-Messaging" -Gerät = device -addcmdline = "- SessionId = Sitzung -SessionOwner = 'Besitzer' -SessionName = 'Build' -dataProviderMode = local -execcmds Automatisierung Liste '= 'LogCommodity OFF' -LogCmds =; runtests Tests + + by + T1 + T2 getrennt sind; beenden‘" -run
Hoffe, dass dies jemand hilft, arbeitete für mich.